package com.huahai.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.huahai.api.aliyunai.model.CreateOutPaintingTaskResponse;
import com.huahai.common.DeleteRequest;
import com.huahai.pojo.dto.picture.*;
import com.huahai.pojo.entity.Picture;
import com.huahai.pojo.entity.User;
import com.huahai.pojo.vo.picture.PictureVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
* @author huahai
* @description 针对表【picture(图片)】的数据库操作Service
* @createDate 2025-07-19 20:39:17
*/
public interface PictureService extends IService<Picture> {

    /**
     * 上传图片
     *
     * @param inputResource 图片输入源
     * @param pictureUploadDTO 图片上传信息（图片的id）
     * @param loginUser 登录用户
     * @return 封装后的图片信息
     */
    PictureVO uploadPicture(Object inputResource, PictureUploadDTO pictureUploadDTO, User loginUser);

    /**
     * 删除图片
     * @param deleteRequest 删除参数
     * @param loginUser 登录用户
     * @return 删除结果
     */
    Boolean deletePicture(DeleteRequest deleteRequest, User loginUser);

    /**
     * 编辑图片（给用户使用）
     * @param pictureEditDTO 图片编辑信息
     * @param loginUser 登录用户
     * @return 编辑结果
     */
    Boolean editPicture(PictureEditDTO pictureEditDTO, User loginUser);

    /**
     * 分页获取图片列表（封装类）利用多级缓存提升性能 (当前使用，对于私人空间可能没用必要使用)
     * @param pictureQueryDTO 图片查询参数
     * @param request 请求
     * @return 分页后的脱敏图片列表
     */
    Page<PictureVO>  listPictureVOByPageByCache(PictureQueryDTO pictureQueryDTO, HttpServletRequest request);

    /**
     * 图片审核功能
     * @param pictureReviewDTO 图片审核信息
     * @param loginUser 登录用户
     */
    void doReviewPicture(PictureReviewDTO pictureReviewDTO, User loginUser);

    /**
     * 批量抓取和创建图片
     *
     * @param pictureUploadByBatchDTO 图片批量上传信息
     * @param loginUser 登录用户
     * @return 成功创建的图片数
     */
    Integer uploadPictureByBatch(PictureUploadByBatchDTO pictureUploadByBatchDTO, User loginUser);

    /**
     * 根据颜色查询排序空间图片
     * @param searchPictureByColorDTO 颜色查询请求类
     * @param loginUser 登录用户
     * @return 排序后的图片列表
     */
    List<PictureVO> searchPictureByColor(SearchPictureByColorDTO searchPictureByColorDTO, User loginUser);

    /**
     * 批量修改图片信息
     * @param pictureEditByBatchDTO 图片批量修改信息
     * @param loginUser 登录用户
     * @return 修改成功的图片数
     */
    Boolean editPictureByBatch(PictureEditByBatchDTO pictureEditByBatchDTO, User loginUser);

    /**
     * 创建图片 AI 扩图任务
     * @param createPictureOutPaintingTaskDTO 创建图片 AI 扩图任务信息
     * @param loginUser 登录用户
     * @return 创建成功任务信息
     */
    CreateOutPaintingTaskResponse createOutPaintingTask(CreatePictureOutPaintingTaskDTO createPictureOutPaintingTaskDTO, User loginUser);

    /**
     * 填充图片信息从 Redis 缓存(浏览量，点赞数，是否点赞)
     * @param page 图片列表
     * @param loginUser 登录用户
     */
    <T> void fillPictureInfoFromRedis(Page<T> page, User loginUser);

    /**
     * 检查图片是否被当前用户点赞
     * @param pictureVO 图片信息
     * @param loginUser 登录用户
     * @return 是否被当前用户点赞
     */
    Boolean checkPictureLiked(PictureVO pictureVO, User loginUser);

    /**
     * picture类型转换脱敏（单张图片）
     * @param picture 图片对象
     * @param request 请求
     * @return PictureVO
     */
    PictureVO getPictureVO(Picture picture, HttpServletRequest request);

    /**
     * 分页获取图片封装
     * @param picturePage 分页参数
     * @return Page<PictureVO> 分页后的脱敏图片列表
     */
    Page<PictureVO> getPictureVoPage(Page<Picture> picturePage);

    /**
     * 封装图片查询条件QueryWrapper
     * @param pictureQueryDTO 图片查询条件
     * @return QueryWrapper<Picture>
     */
    QueryWrapper<Picture> getQueryWrapper(PictureQueryDTO pictureQueryDTO);

    /**
     * 图片基本校验
     * @param picture 图片对象
     */
    void validPicture(Picture picture);

    /**
     * 填充审核参数
     * @param picture 图片对象
     * @param loginUser 登录用户
     */
    void fillReviewParams(Picture picture, User loginUser);

    /**
     * 清除对象存储中的图片图片
     * @param oldPicture 旧图片对象
     */
    void cleanCosPicture(Picture oldPicture);

    /**
     * 清除 caffeine 和 redis 的缓存
     */
    void cleanCaffeineAndRedisCache();

    /**
     * 从完整URL中提取COS对象的key（去掉域名部分）
     * @param url 完整URL
     * @param cosHost COS的域名
     * @return COS对象的key
     */
    String changeUrlToCosKey(String url, String cosHost);

    /**
     * 判断用户是否有操作图片权限
     * @param picture  图片对象
     * @param loginUser 登录用户
     */
    void checkPictureAuth(Picture picture, User loginUser);
}
